'''
分页抓取腾讯招聘网站：如搜索 python，也可以自定义搜索 data = {'keyword':keyword}
地址：https://careers.tencent.com/search.html?index=2&keyword=python

get 请求，有 params 查询数据。

将 data 拼接到 api 接口上即可

遇到的问题：
1.响应的数据为 JSON
2.响应头中包含 params 数据，为查询数据，说明为 get 请求，将这个数据 拼接到 接口即可。这里自己把他当成了 data 数据
3.最终读取的数据为 JSON 数据，自己已经将其转换为 字符形式，其实为 字典，但自己却还一直纠结为 JSON。同时在使用 with open() 保存时，却不知以何种方式保存。应该以 字节。
4.POST 请求时，才有 data 数据，可能也有 get 请求，也同时有 params 数据。
'''

import urllib.request
import urllib.parse
import json

# api 接口
# post 请求
# pot_url = 'https://careers.tencent.com/search.html?'
post_url = 'https://careers.tencent.com/tencentcareer/api/post/Query?'


def create_request(keyword, page):
	# 请求头
	headers = {
		'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36',
	}

	# params 查询数据
	params = {
		'pageIndex': page,
		'keyword': keyword,
		'pageSize': 10,
		'language': 'zh-cn',
		'area': 'cn',
	}

	# 拼接 url
	url = post_url + urllib.parse.urlencode(params)
	# 请求对象的定制
	request = urllib.request.Request(url=url, headers=headers)

	return request


def get_response(request):
	# 发送请求，获取响应数据
	response = urllib.request.urlopen(request)
	# 读取数据，并解码
	resp_data = response.read().decode('utf-8')
	return resp_data


def download_data(resp_data, page):
	# 获取到的数据为 json 字符类型，将其反序列化为 字典形式
	resp_data = json.loads(resp_data)
	# print(type(resp_data))
	# print(resp_data)
	# print(resp_data['Data']['Posts'])
	# 通过字典获取职位数据
	# 当然，这里也能获取更多信息，如单位、地区等
	for recruitPost in resp_data['Data']['Posts']:
		# print(recruitPost['RecruitPostName'])
		recruitPost = recruitPost['RecruitPostName']

		# 存储在文件夹中
		# 以字节写入
		with open('腾讯内部招聘/第{}页-腾讯职位招聘.txt'.format(page), 'a', encoding='utf-8') as file:
			# 写入一个换行一次
			file.write(recruitPost + '\n')


if __name__ == '__main__':
	keyword = input('请输入搜索的职位：')
	start_page = int(input('输入起始页码：'))
	end_page = int(input('输入末尾页码：'))

	for page in range(start_page, end_page + 1):
		# 请求对象定制
		request = create_request(keyword, page)
		# 发送请求，获取响应数据，并读取
		resp_data = get_response(request)
		# 下载数据并保存
		download_data(resp_data, page)
